﻿namespace _11_桥接模式;

/*
 * 桥接模式（Bridge Pattern）是一种结构型设计模式，
 * 它将抽象部分与实现部分分离，使它们可以独立变化而互不影响。
 * 这种模式通过组合的方式，将抽象部分和实现部分连接起来，而不是通过继承的方式。这样可以减少类之间的耦合度，使系统更加灵活。
 */


//在生活中，我们可以通过一个遥控器控制不同品牌的电视来理解桥接模式。遥控器是抽象部分，而电视机的不同品牌是实现部分。使用桥接模式，我们可以轻松地在不修改遥控器的情况下更换电视机品牌。
public class Other2
{

}

// 实现部分接口
interface IDevice
{
    void TurnOn();
    void TurnOff();
    void SetChannel(int channel);
}

// 具体的实现部分1
class TVDevice : IDevice
{
    public void TurnOn()
    {
        Console.WriteLine("TV is ON");
    }

    public void TurnOff()
    {
        Console.WriteLine("TV is OFF");
    }

    public void SetChannel(int channel)
    {
        Console.WriteLine("Channel set to " + channel);
    }
}

// 具体的实现部分2
class RadioDevice : IDevice
{
    public void TurnOn()
    {
        Console.WriteLine("Radio is ON");
    }

    public void TurnOff()
    {
        Console.WriteLine("Radio is OFF");
    }

    public void SetChannel(int channel)
    {
        Console.WriteLine("Frequency set to " + channel);
    }
}

// 抽象部分
abstract class RemoteControl
{
    protected IDevice device;

    public RemoteControl(IDevice device)
    {
        this.device = device;
    }

    public abstract void TurnOn();
    public abstract void TurnOff();
    public abstract void SetChannel(int channel);
}

// 扩展抽象部分
class AdvancedRemoteControl : RemoteControl
{
    public AdvancedRemoteControl(IDevice device) : base(device)
    {
    }

    public override void TurnOn()
    {
        Console.WriteLine("Advanced remote: Turning on the device.");
        device.TurnOn();
    }

    public override void TurnOff()
    {
        Console.WriteLine("Advanced remote: Turning off the device.");
        device.TurnOff();
    }

    public override void SetChannel(int channel)
    {
        Console.WriteLine("Advanced remote: Setting the channel.");
        device.SetChannel(channel);
    }
}

//class Program
//{
//    static void Main()
//    {
//        // 使用桥接模式
//        IDevice tv = new TVDevice();
//        IDevice radio = new RadioDevice();

//        RemoteControl remoteControl = new AdvancedRemoteControl(tv);
//        remoteControl.TurnOn();
//        remoteControl.SetChannel(30);
//        remoteControl.TurnOff();

//        remoteControl = new AdvancedRemoteControl(radio);
//        remoteControl.TurnOn();
//        remoteControl.SetChannel(95.5);
//        remoteControl.TurnOff();
//    }
//}
